React Transition Groupκ³Ό μν λ¨Έμ μ μ¬μ©νμ¬ React μ ν리μΌμ΄μ μμ κ²¬κ³ νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ λλ©μ΄μ μν κ΄λ¦¬ λ°©λ²μ μμ보μΈμ. 볡μ‘ν μ νμ μν κ³ κΈ κΈ°μ μ λ°°μλλ€.
React Transition Group μν λ¨Έμ : μ λλ©μ΄μ μν κ΄λ¦¬ λ§μ€ν°νκΈ°
μ λλ©μ΄μ μ μΉ μ ν리μΌμ΄μ μ μ¬μ©μ κ²½νμ ν¬κ² ν₯μμμΌ μκ°μ νΌλλ°±μ μ 곡νκ³ μνΈμμ©μ λμ± λ§€λ ₯μ μΌλ‘ λ§λλλ€. νμ§λ§ νΉν λμ μΈ React μ ν리μΌμ΄μ λ΄μμ 볡μ‘ν μ λλ©μ΄μ μνλ₯Ό κ΄λ¦¬νλ κ²μ κΈλ°© μ΄λ €μμ§ μ μμ΅λλ€. λ°λ‘ μ΄ μ§μ μμ React Transition Groupκ³Ό μν λ¨Έμ μ μ‘°ν©μ΄ λ§€μ° μ μ©νλ€λ κ²μ΄ μ¦λͺ λ©λλ€. μ΄ κΈμμλ μ΄λ¬ν λꡬλ€μ νμ©νμ¬ κ²¬κ³ νκ³ , μ μ§λ³΄μ κ°λ₯νλ©°, μ μΈμ μΈ μ λλ©μ΄μ λ‘μ§μ λ§λλ λ°©λ²μ κΉμ΄ μκ² λ€λ£Ήλλ€.
ν΅μ¬ κ°λ μ΄ν΄νκΈ°
React Transition Groupμ΄λ 무μμΈκ°?
React Transition Group(RTG)μ κ·Έ μμ²΄λ‘ μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬κ° μλλλ€. λμ , μ»΄ν¬λνΈκ° DOMμ λ€μ΄μ€κ³ λκ°λ μ ν κ³Όμ μ κ΄λ¦¬νλ λ° λμμ μ£Όλ μ»΄ν¬λνΈλ₯Ό μ 곡ν©λλ€. μ΄λ CSS μ ν, CSS μ λλ©μ΄μ λλ JavaScript μ λλ©μ΄μ μ νΈλ¦¬κ±°νλ λ° μ¬μ©ν μ μλ μλͺ μ£ΌκΈ° ν μ λ ΈμΆν©λλ€. μ¦, μ»΄ν¬λνΈκ° *μ΄λ»κ²* μ λλ©μ΄μ μ μ μ©ν΄μΌ νλμ§κ° μλλΌ *μΈμ * μ λλ©μ΄μ μ μ μ©ν΄μΌ νλμ§μ μ΄μ μ λ§μΆ₯λλ€.
React Transition Groupμ μ£Όμ μ»΄ν¬λνΈλ λ€μκ³Ό κ°μ΅λλ€:
- <Transition>: λ¨μΌ μμ μμλ₯Ό μ λλ©μ΄μ νκΈ° μν κΈ°λ³Έ κ΅¬μ± μμμ λλ€. `in` propμ κ°μνμ¬ enter, exit, appear μ νμ νΈλ¦¬κ±°ν©λλ€.
- <CSSTransition>: μ ν λ¨κ³ λμ CSS ν΄λμ€λ₯Ό μΆκ°νκ³ μ κ±°νλ νΈλ¦¬ν μ»΄ν¬λνΈμ λλ€. μ΄λ CSS μ νμ΄λ μ λλ©μ΄μ μ ν΅ν©νλ κ°μ₯ κ°λ¨ν λ°©λ²μΈ κ²½μ°κ° λ§μ΅λλ€.
- <TransitionGroup>: <Transition> λλ <CSSTransition> μ»΄ν¬λνΈ μ§ν©μ κ΄λ¦¬ν©λλ€. μμ΄ν λͺ©λ‘, λΌμ°νΈ λλ λ€λ₯Έ μ»΄ν¬λνΈ μ»¬λ μ μ μ λλ©μ΄μ νλ λ° μ μ©ν©λλ€.
μν λ¨Έμ μ΄λ 무μμΈκ°?
μν λ¨Έμ μ μμ€ν μ λμμ μ€λͺ νλ κ³μ°μ μνμ λͺ¨λΈμ λλ€. μ΄λ μ νν μμ μν, μ΄λ¬ν μν κ°μ μ νμ μ λ°νλ μ΄λ²€νΈ, κ·Έλ¦¬κ³ μ΄λ¬ν μ ν μ€μ λ°μνλ μ‘μ μ μ μν©λλ€. μν λ¨Έμ μ μ¬μ©νλ©΄ 볡μ‘ν λ‘μ§μ μμΈ‘ κ°λ₯μ±κ³Ό λͺ νμ±μ λΆμ¬ν μ μμ΅λλ€.
μν λ¨Έμ μ¬μ©μ μ΄μ μ λ€μκ³Ό κ°μ΅λλ€:
- μ½λ κ΅¬μ± κ°μ : μν λ¨Έμ μ μ ν리μΌμ΄μ λ‘μ§μ κ΄λ¦¬νλ ꡬ쑰μ μΈ μ κ·Ό λ°©μμ κ°μ ν©λλ€.
- μμΈ‘ κ°λ₯μ± μ¦κ°: μν μ νμ΄ λͺ μμ μΌλ‘ μ μλμ΄ μ ν리μΌμ΄μ μ λμμ λ μμΈ‘ κ°λ₯νκ² λ§λ€κ³ λλ²κΉ νκΈ° μ½κ² ν©λλ€.
- ν μ€νΈ μ©μ΄μ± ν₯μ: μν λ¨Έμ μ κ° μνμ μ νμ λ 립μ μΌλ‘ ν μ€νΈν μ μμΌλ―λ‘ λ¨μ ν μ€νΈμ μ ν©ν©λλ€.
- 볡μ‘μ± κ°μ: 볡μ‘ν λ‘μ§μ λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ μνλ‘ λΆν΄νμ¬ μ ν리μΌμ΄μ μ μ 체μ μΈ μ€κ³λ₯Ό λ¨μνν μ μμ΅λλ€.
JavaScriptλ₯Ό μν μΈκΈ° μλ μν λ¨Έμ λΌμ΄λΈλ¬λ¦¬λ‘λ XState, Robot, Machina.js λ±μ΄ μμ΅λλ€. μ΄ κΈμμλ μ¬λ¬ λΌμ΄λΈλ¬λ¦¬μ μ μ©λ μ μλ μΌλ°μ μΈ μμΉμ μ΄μ μ λ§μΆκ² μ§λ§, μμ λ ννλ ₯κ³Ό κΈ°λ₯ λ©΄μμ XStateλ₯Ό μ€μ¬μΌλ‘ μ€λͺ ν μ μμ΅λλ€.
React Transition Groupκ³Ό μν λ¨Έμ κ²°ν©νκΈ°
μ§μ ν νμ React Transition Groupμ μν λ¨Έμ κ³Ό ν¨κ» μ‘°μ¨νλ λ°μ λμ΅λλ€. μν λ¨Έμ μ μ λλ©μ΄μ μ μ λ°μ μΈ μνλ₯Ό κ΄λ¦¬νκ³ , React Transition Groupμ νμ¬ μνλ₯Ό κΈ°λ°μΌλ‘ μ€μ μκ°μ μ νμ μ²λ¦¬ν©λλ€.
μ¬μ© μ¬λ‘: 볡μ‘ν μ νμ κ°μ§ λͺ¨λ¬ μ°½
λ€μκ³Ό κ°μ λ€μν μ ν μνλ₯Ό μ§μνλ λͺ¨λ¬ μ°½μ μκ°ν΄ λ΄ μλ€:
- Entering (μ§μ μ€): λͺ¨λ¬μ΄ νλ©΄μ λνλλ μ λλ©μ΄μ μ΄ μ§ν μ€μ λλ€.
- Entered (μ§μ μλ£): λͺ¨λ¬μ΄ μμ ν 보μ λλ€.
- Exiting (ν΄μ₯ μ€): λͺ¨λ¬μ΄ νλ©΄μμ μ¬λΌμ§λ μ λλ©μ΄μ μ΄ μ§ν μ€μ λλ€.
- Exited (ν΄μ₯ μλ£): λͺ¨λ¬μ΄ μ¨κ²¨μ Έ μμ΅λλ€.
λ€μκ³Ό κ°μ μνλ₯Ό λμ νμ¬ λ³΅μ‘μ±μ λν μ μμ΅λλ€:
- Loading (λ‘λ© μ€): λͺ¨λ¬μ΄ νμλκΈ° μ μ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ μμ΅λλ€.
- Error (μ€λ₯): λ°μ΄ν° λ‘λ© μ€ μ€λ₯κ° λ°μνμ΅λλ€.
μ΄λ¬ν μνλ€μ λ¨μν λΆλ¦¬μΈ(boolean) νλκ·Έλ‘ κ΄λ¦¬νλ κ²μ κΈλ°© λ€λ£¨κΈ° νλ€μ΄μ§ μ μμ΅λλ€. μν λ¨Έμ μ ν¨μ¬ λ κΉλν ν΄κ²°μ± μ μ 곡ν©λλ€.
XStateλ₯Ό μ¬μ©ν ꡬν μμ
λ€μμ XStateλ₯Ό μ¬μ©ν κΈ°λ³Έ μμ μ λλ€:
```javascript import React, { useRef } from 'react'; import { useMachine } from '@xstate/react'; import { createMachine } from 'xstate'; import { CSSTransition } from 'react-transition-group'; import './Modal.css'; // Import your CSS file const modalMachine = createMachine({ id: 'modal', initial: 'hidden', states: { hidden: { on: { OPEN: 'entering', }, }, entering: { entry: 'logEntering', after: { 300: 'visible', // Adjust duration as needed }, }, visible: { on: { CLOSE: 'exiting', }, }, exiting: { entry: 'logExiting', after: { 300: 'hidden', // Adjust duration as needed }, }, }, actions: { logEntering: () => console.log('Entering modal...'), logExiting: () => console.log('Exiting modal...'), } }); function Modal({ children }) { const [state, send] = useMachine(modalMachine); const nodeRef = useRef(null); const isOpen = state.matches('visible') || state.matches('entering'); return ( <>μ€λͺ :
- μν λ¨Έμ μ μ: `modalMachine`μ μν(`hidden`, `entering`, `visible`, `exiting`)μ κ·Έλ€ μ¬μ΄μ μ ν(`OPEN` λ° `CLOSE` μ΄λ²€νΈμ μν΄ νΈλ¦¬κ±°λ¨)μ μ μν©λλ€. `after` μμ±μ `entering` -> `visible` λ° `exiting` -> `hidden`μΌλ‘ μλ μ ννκΈ° μν΄ μ§μ° μκ°μ μ¬μ©ν©λλ€.
- React μ»΄ν¬λνΈ: `Modal` μ»΄ν¬λνΈλ `@xstate/react`μ `useMachine` ν μ μ¬μ©νμ¬ μν λ¨Έμ μ κ΄λ¦¬ν©λλ€.
- React Transition Group: `CSSTransition` μ»΄ν¬λνΈλ `isOpen` λΆλ¦¬μΈ(μν λ¨Έμ μ νμ¬ μνμμ νμλ¨)μ κ°μν©λλ€. CSS μ νμ νΈλ¦¬κ±°νκΈ° μν΄ CSS ν΄λμ€(`modal-enter`, `modal-enter-active`, `modal-exit`, `modal-exit-active`)λ₯Ό μ μ©ν©λλ€.
- CSS μ ν: CSSλ `opacity` μμ±κ³Ό `transition` μμ±μ μ¬μ©νμ¬ μ€μ μ λλ©μ΄μ μ μ μν©λλ€.
μ΄ μ κ·Ό λ°©μμ μ΄μ
- κ΄μ¬μ¬ λΆλ¦¬: μν λ¨Έμ μ μ λλ©μ΄μ λ‘μ§μ κ΄λ¦¬νκ³ , React Transition Groupμ μκ°μ μ νμ μ²λ¦¬ν©λλ€.
- μ μΈμ μ½λ: μν λ¨Έμ μ μνλ μνμ μ νμ μ μνλ―λ‘ μ½λλ₯Ό λ μ½κ² μ΄ν΄νκ³ μ μ§λ³΄μν μ μμ΅λλ€.
- ν μ€νΈ μ©μ΄μ±: μν λ¨Έμ μ λ 립μ μΌλ‘ μ½κ² ν μ€νΈν μ μμ΅λλ€.
- μ μ°μ±: μ΄ μ κ·Ό λ°©μμ λ 볡μ‘ν μ λλ©μ΄μ κ³Ό μνΈμμ©μ μ²λ¦¬νλλ‘ νμ₯ν μ μμ΅λλ€.
κ³ κΈ κΈ°μ
μν κΈ°λ°μ λμ μ ν
νμ¬ μνμ λ°λΌ μ νμ λ§μΆ€ μ€μ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λͺ¨λ¬μ΄ λ€μ΄μ€κ³ λκ° λ λ€λ₯Έ μ λλ©μ΄μ μ μ¬μ©νκ³ μΆμ μ μμ΅λλ€.
```javascript const modalMachine = createMachine({ id: 'modal', initial: 'hidden', context: { animationType: 'fade', }, states: { hidden: { on: { OPEN_FADE: { target: 'entering', actions: assign({ animationType: 'fade' }), }, OPEN_SLIDE: { target: 'entering', actions: assign({ animationType: 'slide' }), }, }, }, entering: { entry: 'logEntering', after: { 300: 'visible', // Adjust duration as needed }, }, visible: { on: { CLOSE: 'exiting', }, }, exiting: { entry: 'logExiting', after: { 300: 'hidden', // Adjust duration as needed }, }, }, actions: { logEntering: () => console.log('Entering modal...'), logExiting: () => console.log('Exiting modal...'), } }); function Modal({ children }) { const [state, send] = useMachine(modalMachine); const nodeRef = useRef(null); const isOpen = state.matches('visible') || state.matches('entering'); const animationType = state.context.animationType; let classNames = `modal ${animationType}` return ( <>μ΄ μμ μμ `animationType`μ μν λ¨Έμ μ 컨ν μ€νΈμ μ μ₯λ©λλ€. `OPEN_FADE`μ `OPEN_SLIDE` μ΄λ²€νΈλ μ΄ μ»¨ν μ€νΈλ₯Ό μ λ°μ΄νΈνκ³ , `Modal` μ»΄ν¬λνΈλ μ΄ κ°μ μ¬μ©νμ¬ `CSSTransition` μ»΄ν¬λνΈμ `classNames` propμ λμ μΌλ‘ ꡬμ±ν©λλ€.
TransitionGroupμΌλ‘ 리μ€νΈ μ λλ©μ΄μ νκΈ°
React Transition Groupμ `TransitionGroup` μ»΄ν¬λνΈλ μμ΄ν λͺ©λ‘μ μ λλ©μ΄μ νλ λ° μ΄μμ μ λλ€. λͺ©λ‘μ κ° μμ΄ν μ `CSSTransition` μ»΄ν¬λνΈλ‘ κ°μ μ μμΌλ©°, `TransitionGroup`μ μ§μ λ° ν΄μ₯ μ λλ©μ΄μ μ κ΄λ¦¬ν©λλ€.
```javascript import React, { useState, useRef } from 'react'; import { TransitionGroup, CSSTransition } from 'react-transition-group'; import './List.css'; function List() { const [items, setItems] = useState(['Item 1', 'Item 2', 'Item 3']); const addItem = () => { setItems([...items, `Item ${items.length + 1}`]); }; const removeItem = (index) => { setItems(items.filter((_, i) => i !== index)); }; return (ν΅μ¬ μ¬ν:
- κ° λ¦¬μ€νΈ μμ΄ν μ `CSSTransition`μΌλ‘ κ°μΈμ¬ μμ΅λλ€.
- `CSSTransition`μ `key` propμ Reactκ° μ΄λ€ μμ΄ν μ΄ μΆκ°λκ±°λ μ κ±°λλμ§ μλ³νλ λ° λ§€μ° μ€μν©λλ€.
- `TransitionGroup`μ λͺ¨λ μμ `CSSTransition` μ»΄ν¬λνΈμ μ νμ κ΄λ¦¬ν©λλ€.
JavaScript μ λλ©μ΄μ μ¬μ©νκΈ°
CSS μ νμ΄ μ»΄ν¬λνΈλ₯Ό μ λλ©μ΄μ νλ κ°μ₯ μ¬μ΄ λ°©λ²μΈ κ²½μ°κ° λ§μ§λ§, λ 볡μ‘ν ν¨κ³Όλ₯Ό μν΄ JavaScript μ λλ©μ΄μ μ μ¬μ©ν μλ μμ΅λλ€. React Transition Groupμ GreenSock(GSAP)μ΄λ Anime.jsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ JavaScript μ λλ©μ΄μ μ νΈλ¦¬κ±°ν μ μλ μλͺ μ£ΌκΈ° ν μ μ 곡ν©λλ€.
`classNames` λμ `Transition` μ»΄ν¬λνΈμ `onEnter`, `onEntering`, `onEntered`, `onExit`, `onExiting`, `onExited` propμ μ¬μ©νμ¬ μ λλ©μ΄μ μ μ μ΄ν©λλ€.
κΈλ‘λ² κ°λ°μ μν λͺ¨λ² μ¬λ‘
κΈλ‘λ² νκ²½μμ μ λλ©μ΄μ μ ꡬνν λλ μ κ·Όμ±, μ±λ₯, λ¬Ένμ λ―Όκ°μ±κ³Ό κ°μ μμλ₯Ό κ³ λ €νλ κ²μ΄ μ€μν©λλ€.
μ κ·Όμ±
- μ¬μ©μ μ νΈλ μ‘΄μ€: μ¬μ©μκ° μν κ²½μ° μ λλ©μ΄μ μ λΉνμ±νν μ μλλ‘ νμ©ν©λλ€ (μ: `prefers-reduced-motion` λ―Έλμ΄ μΏΌλ¦¬ μ¬μ©).
- λμ μ 곡: μ λλ©μ΄μ μ΄ λΉνμ±νλλλΌλ λͺ¨λ νμ μ λ³΄κ° μ¬μ ν μ λ¬λλλ‘ λ³΄μ₯ν©λλ€.
- λ―Έλ¬ν μ λλ©μ΄μ μ¬μ©: κ³Όλνκ±°λ μ°λ§νμ¬ μ¬μ©μλ₯Ό μλνκ±°λ λ©λ―Έλ₯Ό μ λ°ν μ μλ μ λλ©μ΄μ μ νΌν©λλ€.
- ν€λ³΄λ λ€λΉκ²μ΄μ : λͺ¨λ μνΈμμ© μμκ° ν€λ³΄λ λ€λΉκ²μ΄μ μ ν΅ν΄ μ κ·Ό κ°λ₯νλλ‘ λ³΄μ₯ν©λλ€.
μ±λ₯
- μ λλ©μ΄μ μ΅μ ν: λΆλλ¬μ΄ μ λλ©μ΄μ μ μν΄ CSS transformκ³Ό opacityλ₯Ό μ¬μ©ν©λλ€. `width`λ `height`μ κ°μ λ μ΄μμ μμ±μ μ λλ©μ΄μ νλ κ²μ νΌν©λλ€.
- λλ°μ΄μ± λ° μ€λ‘νλ§: μ¬μ©μ μ λ ₯μ μν΄ νΈλ¦¬κ±°λλ μ λλ©μ΄μ μ λΉλλ₯Ό μ νν©λλ€.
- νλμ¨μ΄ κ°μ μ¬μ©: μ λλ©μ΄μ μ΄ λΈλΌμ°μ μ μν΄ νλμ¨μ΄ κ°μλλμ§ νμΈν©λλ€.
λ¬Ένμ λ―Όκ°μ±
- κ³ μ κ΄λ νΌνκΈ°: μ λλ©μ΄μ μ μ¬μ©ν λ λ¬Ένμ κ³ μ κ΄λ μ μ£Όμν©λλ€.
- ν¬μ©μ μΈ μ΄λ―Έμ§ μ¬μ©: λ€μν μ¬μ©μλ₯Ό λννλ μ΄λ―Έμ§λ₯Ό μ νν©λλ€.
- λ€μν μΈμ΄ κ³ λ €: μ λλ©μ΄μ μ΄ λ€λ₯Έ μΈμ΄ λ° μ°κΈ° λ°©ν₯(μ: μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μ°λ μΈμ΄)μμλ μ¬λ°λ₯΄κ² μλνλμ§ νμΈν©λλ€.
μΌλ°μ μΈ ν¨μ κ³Ό ν΄κ²°μ±
μ λλ©μ΄μ μ΄ νΈλ¦¬κ±°λμ§ μλ κ²½μ°
λ¬Έμ : μ»΄ν¬λνΈκ° μ§μ νκ±°λ ν΄μ₯ν λ μ λλ©μ΄μ μ΄ μμλμ§ μμ΅λλ€.
ν΄κ²°μ± :
- ν΄λμ€ μ΄λ¦ νμΈ: `CSSTransition`μ `classNames` propμ μ¬μ©λ CSS ν΄λμ€ μ΄λ¦μ΄ CSS νμΌμ μ μλ ν΄λμ€ μ΄λ¦κ³Ό μΌμΉνλμ§ νμΈν©λλ€.
- νμμμ νμΈ: `timeout` propμ΄ μ λλ©μ΄μ μ΄ μλ£λκΈ°μ μΆ©λΆν κΈ΄μ§ νμΈν©λλ€.
- DOM κ²μ¬: λΈλΌμ°μ μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ DOMμ κ²μ¬νκ³ μ¬λ°λ₯Έ CSS ν΄λμ€κ° μ μ©λκ³ μλμ§ νμΈν©λλ€.
- 리μ€νΈμ Key Prop λ¬Έμ : 리μ€νΈλ₯Ό μ λλ©μ΄μ ν λ, Transition λλ CSSTransition μ»΄ν¬λνΈμ 'key' propμ΄ μκ±°λ κ³ μ νμ§ μμΌλ©΄ μ’ μ’ λ¬Έμ κ° λ°μν©λλ€. ν€κ° 리μ€νΈμ κ° νλͺ©μ λν μμ μ μ΄κ³ κ³ μ ν μλ³μλ₯Ό κΈ°λ°μΌλ‘ νλμ§ νμΈνμμμ€.
μ λλ©μ΄μ λ²λ² κ±°λ¦Ό λλ μ§μ°
λ¬Έμ : μ λλ©μ΄μ μ΄ λΆλλ½μ§ μκ³ λ²λ² 거리거λ μ§μ°λλ κ²μ²λΌ 보μ λλ€.
ν΄κ²°μ± :
- CSS μ΅μ ν: λ λΆλλ¬μ΄ μ λλ©μ΄μ μ μν΄ CSS transformκ³Ό opacityλ₯Ό μ¬μ©ν©λλ€. λ μ΄μμ μμ±μ μ λλ©μ΄μ νλ κ²μ νΌν©λλ€.
- νλμ¨μ΄ κ°μ: μ λλ©μ΄μ μ΄ νλμ¨μ΄ κ°μλλμ§ νμΈν©λλ€.
- DOM μ λ°μ΄νΈ μ€μ΄κΈ°: μ λλ©μ΄μ μ€μ DOM μ λ°μ΄νΈ νμλ₯Ό μ΅μνν©λλ€.
μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλμ§ μλ κ²½μ°
λ¬Έμ : ν΄μ₯ μ λλ©μ΄μ μ΄ μλ£λ νμλ μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλμ§ μμ΅λλ€.
ν΄κ²°μ± :
- `unmountOnExit` μ¬μ©: ν΄μ₯ μ λλ©μ΄μ ν μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλλλ‘ `CSSTransition`μ `unmountOnExit` propμ `true`λ‘ μ€μ ν©λλ€.
- μν λ¨Έμ λ‘μ§ νμΈ: μ λλ©μ΄μ μ΄ μλ£λ ν μν λ¨Έμ μ΄ `hidden` λλ `exited` μνλ‘ μ¬λ°λ₯΄κ² μ νλλμ§ νμΈν©λλ€.
κ²°λ‘
React Transition Groupκ³Ό μν λ¨Έμ μ κ²°ν©νλ κ²μ React μ ν리μΌμ΄μ μμ μ λλ©μ΄μ μν κ΄λ¦¬μ λν κ°λ ₯νκ³ μ μ§λ³΄μ κ°λ₯ν μ κ·Ό λ°©μμ μ 곡ν©λλ€. κ΄μ¬μ¬λ₯Ό λΆλ¦¬νκ³ , μ μΈμ μ½λλ₯Ό μ¬μ©νλ©°, λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ μ ν리μΌμ΄μ μ μ¬μ©μ±κ³Ό λ§€λ ₯μ ν₯μμν€λ λ§€λ ₯μ μ΄κ³ μ κ·Όμ± λμ μ¬μ©μ κ²½νμ λ§λ€ μ μμ΅λλ€. μ μΈκ³ μ¬μ©μλ₯Ό μν μ λλ©μ΄μ μ ꡬνν λλ μ κ·Όμ±, μ±λ₯, λ¬Ένμ λ―Όκ°μ±μ κ³ λ €νλ κ²μ μμ§ λ§μμμ€.
μ΄λ¬ν κΈ°μ μ λ§μ€ν°νλ©΄ κ°μ₯ 볡μ‘ν μ λλ©μ΄μ μλ리μ€λ μ²λ¦¬νκ³ μ§μ μΌλ‘ μΈμμ μΈ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό λ§λ€ μ μλ μ€λΉλ₯Ό κ°μΆκ² λ κ²μ λλ€.